home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 27 / CU Amiga Magazine's Super CD-ROM 27 (1998)(EMAP Images)(GB)[!][issue 1998-10].iso / CUCD / Sound / SPlayer / Socks5 / src / lib / addr.c next >
C/C++ Source or Header  |  1998-07-20  |  6KB  |  216 lines

  1. /* Copyright (c) 1995,1996,1997 NEC Corporation.  All rights reserved.       */
  2. /*                                                                           */
  3. /* The redistribution, use and modification in source or binary forms of     */
  4. /* this software is subject to the conditions set forth in the copyright     */
  5. /* document ("Copyright") included with this distribution.                   */
  6.  
  7. /*
  8.  * $Id: addr.c,v 1.21 1997/06/16 15:29:35 steve Exp $
  9.  */
  10.  
  11. #include "socks5p.h"
  12. #include "threads.h"
  13. #include "addr.h"
  14. #include "log.h"
  15.  
  16. IFTHREADED(extern MUTEX_T gh_mutex;)
  17. IFTHREADED(extern MUTEX_T gs_mutex;)
  18.  
  19. /* Given a name return the network ordered address associated with that      */
  20. /* name or INVALIDADDR (-1) on an error.                                     */
  21. int lsName2Addr(const char *name, S5NetAddr *na) {
  22.     struct hostent *hp;
  23.  
  24.     if (!name || *name == '\0' || !strcmp(name, "-")) {
  25.     return -1;
  26.     }
  27.  
  28.     /* XXX needs IPv6 support eventually                                     */
  29.     memset(&na->sin, 0, sizeof(ssi));
  30.     na->sin.sin_family      = AF_INET;
  31.     na->sin.sin_addr.s_addr = INVALIDADDR;
  32.  
  33.     if ((na->sin.sin_addr.s_addr = inet_addr((char *)name)) != INVALIDADDR) {
  34.     return 0;
  35.     }
  36.     
  37.     MUTEX_LOCK(gh_mutex);
  38.     if ((hp = REAL(gethostbyname)(name))) memcpy(&na->sin.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length);
  39.     MUTEX_UNLOCK(gh_mutex);
  40.  
  41.     return hp?0:-1;
  42. }
  43.  
  44. /* Given a name return the network ordered port associated with that name,   */
  45. /* or INVALIDPORT (-1) on an error.                                          */
  46. int lsName2Port(const char *name, const char *proto, u_short *port) {
  47.     struct servent *sp;
  48.  
  49.     if (isdigit(*name)) {
  50.     *port = (u_short)atoi(name);
  51.     *port = htons(*port);
  52.     return 0;
  53.     }
  54.  
  55.     MUTEX_LOCK(gs_mutex);
  56.     if ((sp = getservbyname((char *)name, proto))) *port = sp->s_port;
  57.     MUTEX_UNLOCK(gs_mutex);
  58.     if (sp) return 0;
  59.  
  60.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_WARNING, 0, "Unresolvable service name: %s", name);
  61.     *port = INVALIDPORT;
  62.     return -1;
  63. }
  64.  
  65. /* Return 0 if the address is NULL                                            */
  66. int lsAddrIsNull(const S5NetAddr *addr) {
  67.     int rval = 0;
  68.  
  69.     switch (addr->sa.sa_family) {
  70.     case AF_S5NAME:
  71.         if (*addr->sn.sn_name != '\0') rval = -1;
  72.         break;
  73.     case AF_INET:
  74.         if (addr->sin.sin_addr.s_addr != INADDR_ANY && addr->sin.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) rval = -1;
  75.         break;
  76. #ifdef HAVE_NETINET6_IN6_H
  77.     case AF_INET6:
  78.         if (addr->sin6.sin6_addr != INADDR_ANY && addr->sin6.sin6_addr != htonl(INADDR_LOOPBACK)) rval = -1;
  79.         break;
  80. #endif
  81.     default:
  82.         break;
  83.     }
  84.  
  85.     return rval;
  86. }
  87.  
  88. int lsAddrComp(const S5NetAddr *a1, const S5NetAddr *a2) {
  89.     if (a1->sa.sa_family != a2->sa.sa_family) return -1;
  90.  
  91.     switch (a1->sa.sa_family) {
  92.     case AF_S5NAME:
  93.         if (a1->sn.sn_port != a2->sn.sn_port) return -1;
  94.         return strcmp(a1->sn.sn_name, a2->sn.sn_name);
  95.     case AF_INET:
  96.         if (a1->sin.sin_port != a2->sin.sin_port) return -1;
  97.         return memcmp(&a1->sin.sin_addr, &a2->sin.sin_addr, sizeof(struct in_addr));
  98. #ifdef HAVE_NETINET6_IN6_H
  99.     case AF_INET6:
  100.         if (a1->sin6.sin6_port != a2->sin6.sin6_port) return -1;
  101.         return memcmp(&a1->sin6.sin6_addr, &a2->sin6.sin6_addr, sizeof(struct in_addr6));
  102. #endif
  103.     default:
  104.         return -1;
  105.     }
  106. }
  107.  
  108. int lsAddrAddrComp(const S5NetAddr *a1, const S5NetAddr *a2) {
  109.     if (a1->sa.sa_family != a2->sa.sa_family) return -1;
  110.  
  111.     switch (a1->sa.sa_family) {
  112.     case AF_S5NAME:
  113.         return strcmp(a1->sn.sn_name, a2->sn.sn_name);
  114.     case AF_INET:
  115.         return memcmp(&a1->sin.sin_addr, &a2->sin.sin_addr, sizeof(struct in_addr));
  116. #ifdef HAVE_NETINET6_IN6_H
  117.     case AF_INET6:
  118.         return memcmp(&a1->sin6.sin6_addr, &a2->sin6.sin6_addr, sizeof(struct in_addr6));
  119. #endif
  120.     default:
  121.         return -1;
  122.     }
  123. }
  124.  
  125. void lsAddrCopy(S5NetAddr *dest, const S5NetAddr *src, int len) {
  126.     memcpy(dest, src, MIN(len, lsAddrSize(src)));
  127. }
  128.  
  129. const char *lsAddr2Ascii(const S5NetAddr *na) {
  130.     switch (na->sa.sa_family) {
  131.     case AF_S5NAME:
  132.         return na->sn.sn_name;
  133.     case AF_INET:
  134.         return inet_ntoa(na->sin.sin_addr);
  135. #ifdef HAVE_NETINET6_IN6_H
  136.     case AF_INET6:
  137.         return addr2ascii(AF_INET6, (char *)&na->sin6.sin6_addr, sizeof(struct in_addr6), NULL);
  138. #endif
  139.     default:
  140.         return "";
  141.     }
  142. }
  143.  
  144. u_short lsAddr2Port(const S5NetAddr *na) {
  145.     switch (na->sa.sa_family) {
  146.     case AF_S5NAME:
  147.         return na->sn.sn_port;
  148.     case AF_INET:
  149.         return na->sin.sin_port;
  150. #ifdef HAVE_NETINET6_IN6_H
  151.     case AF_INET6:
  152.         return na->sin6.sin6_port;
  153. #endif
  154.     default:
  155.         return (u_short)0;
  156.     }
  157. }
  158.  
  159. void lsAddrSetPort(S5NetAddr *na, u_short port) {
  160.     switch (na->sa.sa_family) {
  161.     case AF_S5NAME:
  162.         na->sn.sn_port = port;
  163.     case AF_INET:
  164.         na->sin.sin_port = port;
  165. #ifdef HAVE_NETINET6_IN6_H
  166.     case AF_INET6:
  167.         na->sin6.sin6_port = port;
  168. #endif
  169.     }
  170. }
  171.  
  172. const char *lsAddr2Ptr(const S5NetAddr *na) {
  173.     switch (na->sa.sa_family) {
  174.     case AF_S5NAME:
  175.         return na->sn.sn_name;
  176.     case AF_INET:
  177.         return (char *)&na->sin.sin_addr;
  178. #ifdef HAVE_NETINET6_IN6_H
  179.     case AF_INET6:
  180.         return (char *)&na->sin6.sin6_addr;
  181. #endif
  182.     default:
  183.         return (char *)&na->sa.sa_data;
  184.     }
  185. }
  186.     
  187. int lsAddrAddrSize(const S5NetAddr *na) {
  188.     switch (na->sa.sa_family) {
  189.     case AF_S5NAME:
  190.         return strlen(na->sn.sn_name);
  191.     case AF_INET:
  192.         return sizeof(struct in_addr);
  193. #ifdef HAVE_NETINET6_IN6_H
  194.     case AF_INET6:
  195.         return sizeof(struct in_addr6);
  196. #endif
  197.     default:
  198.         return 0;
  199.     }
  200. }
  201.  
  202. int lsAddrSize(const S5NetAddr *na) {
  203.     switch (na->sa.sa_family) {
  204.     case AF_S5NAME:
  205.         return sizeof(ssn);
  206.     case AF_INET:
  207.         return sizeof(ssi);
  208. #ifdef HAVE_NETINET6_IN6_H
  209.     case AF_INET6:
  210.         return sizeof(ssi6);
  211. #endif
  212.     default:
  213.         return 0;
  214.     }
  215. }
  216.